Индексы в PostgreSQL
Зачем это знать:
-
Тип индекса должен соответствовать типу запросов.
-
“Есть индекс” ≠ “он будет использован”.
Связанные темы:
Планировщик запросов и EXPLAIN
Основные типы индексов (концептуально)
-
B-Tree — дефолт: равенство, диапазоны, сортировки, prefix-условия.
-
GIN — часто для массивов/JSONB/full-text (много значений на строку).
-
GiST — гео/поиск по расстояниям и другие “нетривиальные” операторы.
-
BRIN — большие таблицы с коррелированным порядком (например, по времени), дешёвый по размеру.
Почему индекс может не примениться
-
Низкая селективность.
-
Условие “ломает” sargability (функция на колонке, несоответствие типов, не тот оператор).
-
Планировщик считает, что seq scan дешевле (по статистике).
-
Нужны данные из heap (и их много) ⇒ Index Scan деградирует.
Побочные эффекты индексов
-
Ускоряют чтение, но замедляют запись (INSERT/UPDATE/DELETE) — нужно поддерживать структуру индекса.
-
Могут раздуваться (bloat) и требовать обслуживания.